package niuke.test;

import java.util.*;

/**牛牛的数列
 * 牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:
 * 最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。
 */
public class MaxSubStr {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int  n = sc.nextInt();
//        int  n = 10;
//        int[] arr = new int[]{7,2,3,1,5,6,1,3,8,2} ;
          int[] arr = new int[n] ;

        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

//        method1(n,arr);
        method2(n,arr);
    }

    public static void method2(int n,int[]arr){

        int[]a1 =  new int[n];//没有修改的最长上升
        int[]a2 =  new int[n];//修改了的最长上升
        int[]c =  new int[n];//修改的值

        if (n >= 0) System.arraycopy(arr, 0, c, 0, n);

        a2[0] = 1;
        a1[0] = 1;
        for(int i=1;i<n;i++){
            if(arr[i]>arr[i-1])//初始阿虎a1
                a1[i]=a1[i-1]+1;
            else
                a1[i] = 1;
        }
        int max =1;
        for(int i=1;i<n;i++){
            if (arr[i] > c[i - 1]) {//正常情况
                a2[i] =a2[i - 1] + 1;
            } else {//当前值小了
                a2[i] = a1[i-1]+1;
                c[i]=arr[i-1]+1;
            }
            max=Math.max(max, a2[i]);
        }

        System.out.println("....................");
        for(int i=0;i<n;i++){
            System.out.print(arr[i]+"\t\t");
        }
        System.out.println();
        for(int i=0;i<n;i++){
            System.out.print(a1[i]+"\t\t");
        }

        System.out.println();

        for(int i=0;i<n;i++){
            System.out.print(a2[i]+"\t\t");
        }

        System.out.println();
        for(int i=0;i<n;i++){
            System.out.print(c[i]+"\t\t");
        }
        System.out.println();

        System.out.println(max);
    }

    public static void method1(int n,int[]arr){//滑动窗口
        int i=0,j=1,max = 1;

        if(n==1)
            System.out.println(1);

        while(i != n && j!=n && i<j){
            if(ok(i,j,arr)){
                max = Math.max(max,(j-i+1) );
                j++;
            }else {
                i++;
            }
//            if(max==7)
//            System.out.println(max+": "+i+","+j);
        }
        System.out.println(max);
    }

    static private  boolean  ok(int a, int b, int []arr){//【】闭区间
        ArrayList<Integer> x = new ArrayList<>();
        for(int i=a;i<b;i++){
            int diff = arr[i + 1] - arr[i];
            x.add(diff);
        }
        boolean flag1 = true;
        int  sum =0;
        for (int i = 0; i < x.size()-1; i++) {
            if(x.get(i)<=0){
                //       7 6 9 ，7 6 8         。。。。7 8      1 2.。。。。。
                flag1 = x.get(i)+x.get(i+1)>1 || ( i-1>=0 && x.get(i)+x.get(i-1)>1);
                sum ++;  //几个谷底
            }
        }
        //     1个   且  满足1个谷底条件    0个谷底  或者  这个谷底在最后
        return sum<=1 && flag1  &&  (sum != 1 || (x.get(x.size() - 1)) > 0);
    }
}